#include <sys/types.h>
#include <arpa/inet.h>
#include "common_impl.h"

int creer_socket(int prop, int *port_num)
{
	int fd = 0;

	/* fonction de creation et d'attachement */
	/* d'une nouvelle socket */
	/* renvoie le numero de descripteur */
	/* et modifie le parametre port_num */

	int list_s; // socket d'écoute
	int port; // numéro du port
	struct sockaddr_in servaddr; // socket addresse structure
	//char buffer[MAXBUF]; //character buffer
	//char *endptr; // for strtol()

	if ( (list_s = socket(AF_INET,SOCK_STREAM,0)) < 0 ){
		fprintf(stderr, "ECHOSERV :Error creating listening socket.\n");

		exit( EXIT_FAILURE );
	}

	/* Set all bytes in socket address structure to
                        zero, and fill in the relevant data members */

	memset(&servaddr, 0, sizeof (servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = 0;
	servaddr.sin_addr.s_addr = INADDR_ANY;
	int optval=1;
	setsockopt(list_s,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));

	/*  Bind our socket address to the
   	            listening socket*/

	if (bind( list_s,(struct sockaddr *) &servaddr,sizeof(servaddr)) < 0 ){
		fprintf(stderr, "ECHOSERV :Error calling binding().\n");
		exit( EXIT_FAILURE );
	}
	/* get assigned port */

	struct sockaddr_in sock_info;
	socklen_t size = sizeof(sock_info);
	getsockname(list_s, (struct sockaddr *) &sock_info, &size);
	fprintf(stdout,"port : %d\n", ntohs(sock_info.sin_port));
	port=ntohs(sock_info.sin_port);




	fd=list_s;

	return fd;
}

/* Vous pouvez ecrire ici toutes les fonctions */
/* qui pourraient etre utilisees par le lanceur */
/* et le processus intermediaire. N'oubliez pas */
/* de declarer le prototype de ces nouvelles */
/* fonctions dans common_impl.h */





/*  On recupere le nom de la machine distante */
/* 1- d'abord la taille de la chaine */
//	read(stdout_fils[0][0], buffer, sizeof(int));
//	char * taille=atoi(buffer);
//
//	/* 2- puis la chaine elle-meme */
//	read(stdout_fils[0][0], buffer, taille);
//	char * nom=strdup(buffer);
//	printf("nom : %s", nom);
//
//	/* On recupere le pid du processus distant  */
//	read(stdout_fils[0][0], buffer, sizeof(int));
//	int pid_received=atoi(buffer);
//	printf(" pid : %d", pid_received);
//	/* On recupere le numero de port de la socket */
//	/* d'ecoute des processus distants */
//	read(stdout_fils[0][0], buffer, sizeof(int));
//	int num_port=atoi(buffer);
//	printf(" num : %d", num_port);



//	/*Envoi nombre de caracteres dans le nom de la machine*/
//	fprintf(stdout,"%d", strlen(argv[0]));
//	/* Envoi du nom de machine au lanceur */
//	fprintf(stdout,"%s", argv[0]);
//	/* Envoi du pid au lanceur */
//	fprintf(stdout, "%d", argv[2]);

//	/* Recuperation du nombre de machines */
//	readline(sockfd, buffer, MAXBUF-1);
//	num_proc=atoi(buffer);
//
//	/* Recevoir autant de messages que de machines */
//	for (i = 0; i< num_proc; i++){
//		readline(sockfd, buffer, MAXBUF-1);
//	}
